package cn.design.realize;

/**
 * @author dlq
 * @description 单例代码简单实现--双重校验
 * @date 2020/9/10 9:20
 * @since 1.0
 */
public class Singleton {
    //volatile 保证线程之前的可见性和有序性，singleton = null; 保证了线程之前的初始值同步
    private static volatile Singleton singleton = null;

    // 将构造方法改成私有的,确保不被实例化
    private Singleton() {
    }

    //使用静态方法,可以直接类名.方法名,而且构造方法私有化,如果不是静态的无法调用的
    public static Singleton getSingleton() {
        if (singleton == null) {//第一个判断，为了确保singleton不为空
            synchronized (Singleton.class) {//将当前Singleton.class作为一把锁,使用代码块+上层的if,可以减少线程对锁资源的竞争
                if (singleton == null) {//再次确保对象没有被其他线程修改
                    singleton = new Singleton();
                    return singleton;
                }
            }
        }
        return singleton;
    }
}
